/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.analyzer;

import java.util.List;

import ade.prime.model.Lesson;
import ade.prime.model.LessonType;
import ade.prime.model.Schedule;
import android.util.Log;

/**
 * Classe FeedAnalyzer, permet de construire des objets {@code  Leesson} à un emploi du temps à patir de du {@code FeedLesson},
 * récupéré.
 * @author  Zanette Sébastien, Andrianjafintrimo Victor
 */
public class FeedAnalyzer {
	
	private static final String TAG = FeedAnalyzer.class.getSimpleName() ;

	protected static final int ROOMS = 0 ;
	protected static final int GROUPS = 1 ;
	protected static final int TEACHERS = 2 ;
	protected static final int TIME = 3 ;

	protected static final int UNKNOWN = 0 ;
	protected static final int IS_TIME = 1 ;
	protected static final int IS_GROUP = 2 ;
	protected static final int IS_TEACHER = 3 ;
	protected static final int IS_ROOM = 4 ;

	protected Schedule schedule ;
	protected List<FeedLesson> feeds ;

	/**
	 * Nouvelle instance de <code>FeedAnalyzer</code>.
	 * @param schedule emploi du temps
	 * @param feeds liste de cours parsés
	 */
	public FeedAnalyzer (Schedule schedule, List<FeedLesson> feeds) {
		this.schedule = schedule ;
		this.feeds = feeds ;
	}// FeedAnalyzer

	/**
	 * Analyse le contenu des <code>FeedLesson</code> and construit les cours.
	 * Analyzes the content of the feeds and builds the Lessons.
	 */
	public void start () {
//		Log.d(TAG, "[start]- feeds: " + this.feeds.size()) ;
		this.schedule.ensureCapacity(this.feeds.size()) ;
		for(FeedLesson feed : this.feeds) {
			StringBuilder roomsBuilder = new StringBuilder();
			StringBuilder groupsBuilder = new StringBuilder();
			StringBuilder teachersBuilder = new StringBuilder();
			Lesson l = new Lesson() ;

			l.setTitle(feed.getName()) ;
			l.setScheduleId(this.schedule.getId()) ;
			l.setType(LessonType.NORMAL) ;
			l.setCreated(feed.getCreation()) ;  
			l.setGuid(feed.getId()) ;

			for (FeedResource fr : feed.getResources()) {
				if (fr.getCategory().equals("classroom")) { //$NON-NLS-1$
					roomsBuilder.append(","); //$NON-NLS-1$
					roomsBuilder.append(fr.getName());
				}
				else if (fr.getCategory().equals("trainee")) { //$NON-NLS-1$
					groupsBuilder.append(","); //$NON-NLS-1$
					groupsBuilder.append(fr.getName());
				}
				else if (fr.getCategory().equals("instructor") || fr.getCategory().equals("category5")) { //$NON-NLS-1$ //$NON-NLS-2$
					teachersBuilder.append(","); //$NON-NLS-1$
					teachersBuilder.append(fr.getName());
				}
			}
			String rooms = roomsBuilder.toString();
			String groups = groupsBuilder.toString();
			String teachers = teachersBuilder.toString();
			if (rooms.length()>0)
				rooms = rooms.substring(1);
			if (groups.length()>0)
				groups = groups.substring(1);
			if (teachers.length()>0)
				teachers = teachers.substring(1);

			l.setRoom(rooms);
			l.setGroups(groups);
			l.setTeachers(teachers);
			l.setColor(feed.getColor());
			l.setNote(feed.getNote());

			l.setTime(insertDate(feed.getDate(), feed.getStartHour(), feed.getEndHour())) ;
			// Add the lesson
			this.schedule.append(l) ; 
			l.setScheduleId(this.schedule.getId()) ;
		}// for               
	}// start()

	/**
	 * Change le format de la date avant l'insertion dans la base de données.
	 * @param date date au format mm/dd/yyyy
	 * @param startHour heure de début
	 * @param endHour heure de fin
	 * @return la date au format "yyyy/mm/dd HeureDebut HeureFin"
	 */
	protected static String insertDate(String date, String startHour, String endHour) {
		//TO DO changer le format de la date pour l'insertion dans la BD
		String dateTime = date+" "+startHour+" - "+endHour; //$NON-NLS-1$ //$NON-NLS-2$
		int posSpace = dateTime.indexOf(" ") ; //$NON-NLS-1$
		String datePart = new String(dateTime.substring(0, posSpace)) ;
		String[] parts = datePart.split("/") ; //$NON-NLS-1$
		StringBuilder invDate = new StringBuilder() ;
		invDate.append(parts[2]) ;
		invDate.append("/") ; //$NON-NLS-1$
		invDate.append(parts[1]) ;
		invDate.append("/") ; //$NON-NLS-1$
		invDate.append(parts[0]) ;
		invDate.append(new String(dateTime.substring(posSpace))) ;
		return invDate.toString() ;
	}


}// class FeedAnalyzer